package com.reebake.ideal.storage.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.reebake.ideal.json.util.JsonUtil;
import com.reebake.ideal.storage.entity.FileDetail;
import com.reebake.ideal.storage.entity.FileInfoDTO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.SneakyThrows;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.hash.HashInfo;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Map;

public class StorageUtil {

    /**
     * 将 FileDetail 转为 FileInfo
     */
    @SneakyThrows
    public static FileInfo toFileInfo(FileDetail detail) {
        if(detail == null) {
            return null;
        }
        FileInfo info = BeanUtil.copyProperties(
                detail, FileInfo.class, "metadata", "userMetadata", "thMetadata", "thUserMetadata", "attr", "hashInfo");

        // 这里手动获取数据库中的 json 字符串 并转成 元数据，方便使用
        info.setMetadata(jsonToMetadata(detail.getMetadata()));
        info.setUserMetadata(jsonToMetadata(detail.getUserMetadata()));
        info.setThMetadata(jsonToMetadata(detail.getThMetadata()));
        info.setThUserMetadata(jsonToMetadata(detail.getThUserMetadata()));
        // 这里手动获取数据库中的 json 字符串 并转成 附加属性字典，方便使用
        info.setAttr(jsonToDict(detail.getAttr()));
        // 这里手动获取数据库中的 json 字符串 并转成 哈希信息，方便使用
        info.setHashInfo(jsonToHashInfo(detail.getHashInfo()));
        info.setId(detail.getFileDetailId());
        return info;
    }

    /**
     * 将 json 字符串转换成元数据对象
     */
    public static Map<String, String> jsonToMetadata(String json) throws JsonProcessingException {
        if (StrUtil.isBlank(json)) return null;
        return JsonUtil.toBean(json, new TypeReference<Map<String, String>>() {});
    }

    /**
     * 将 json 字符串转换成字典对象
     */
    public static Dict jsonToDict(String json) throws JsonProcessingException {
        if (StrUtil.isBlank(json)) return null;
        return JsonUtil.toBean(json, Dict.class);
    }

    /**
     * 将 json 字符串转换成哈希信息对象
     */
    public static HashInfo jsonToHashInfo(String json) throws JsonProcessingException {
        if (StrUtil.isBlank(json)) return null;
        return JsonUtil.toBean(json, HashInfo.class);
    }

    /**
     * 将 FileInfo 转为 FileDetail
     */
    @SneakyThrows
    public static FileDetail toFileDetail(FileInfo info) {
        FileDetail detail = BeanUtil.copyProperties(
                info, FileDetail.class, "metadata", "userMetadata", "thMetadata", "thUserMetadata", "attr", "hashInfo");

        // 这里手动获 元数据 并转成 json 字符串，方便存储在数据库中
        detail.setMetadata(valueToJson(info.getMetadata()));
        detail.setUserMetadata(valueToJson(info.getUserMetadata()));
        detail.setThMetadata(valueToJson(info.getThMetadata()));
        detail.setThUserMetadata(valueToJson(info.getThUserMetadata()));
        // 这里手动获 取附加属性字典 并转成 json 字符串，方便存储在数据库中
        detail.setAttr(valueToJson(info.getAttr()));
        // 这里手动获 哈希信息 并转成 json 字符串，方便存储在数据库中
        detail.setHashInfo(valueToJson(info.getHashInfo()));
        return detail;
    }

    /**
     * 将指定值转换成 json 字符串
     */
    public static String valueToJson(Object value) throws JsonProcessingException {
        if (value == null) return null;
        return JsonUtil.toJsonStr(value);
    }

    public static FileInfoDTO toFileInfoDTO(FileInfo fileInfo) {
        return BeanUtil.copyProperties(fileInfo, FileInfoDTO.class);
    }

    public static BufferedImage createTextWaterMark(String text, Integer width, Integer height) {
        Assert.notBlank(text, "水印文案不能为空");
        Assert.notNull(text, "水印宽度不能为空");
        Assert.notNull(text, "水印高度不能为空");
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D graphics2D = bufferedImage.createGraphics();
        bufferedImage = graphics2D.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        graphics2D.dispose();

        Color color = Color.BLACK;
        Font font = new Font("Arial", Font.BOLD, 26);

        graphics2D = bufferedImage.createGraphics();
        graphics2D = bufferedImage.createGraphics();
        graphics2D.setFont(font);
        graphics2D.setColor(color);
        graphics2D.rotate(Math.toRadians(-45), width/2, height/2);
        FontMetrics fm = graphics2D.getFontMetrics();
        // 计算居中坐标
        int x = (width - fm.stringWidth(text)) / 2;
        int y = (height - fm.getHeight()) / 2 + fm.getAscent();
        graphics2D.drawString(text, x, y);
        graphics2D.dispose();

        return bufferedImage;
    }
}
